package statechart;

import statechart.Zustand;

public class Politiker {
	/** Zustand der ersten Ebene der Parallelkomposition*/
	private Zustand parteiZustand;
	/** Zustand der zweiten Ebene der Parallelkomposition*/
	private Zustand wirtschaftsZustand;
	
	/**
	 * Konstruiert einen Politiker dessen Startzustände
	 * 'LOYAL' und 'ERGEBEN' sind.
	 */
	public Politiker() {
		parteiZustand = Zustand.LOYAL;
		wirtschaftsZustand = Zustand.ERGEBEN;
	}
	
	/**
	 * Prüft, ob der Politiker politisch aktiv ist.
	 * @return	'true' wenn ja, 'false' wenn nein
	 */
	public boolean aktiv() {
		if (parteiZustand == Zustand.RUHESTAND
		||  wirtschaftsZustand == Zustand.AUFSICHTSRAT) {
			return false;
		}
		return true;
	}
	
	/**
	 * Prüft, ob ein Politiker protegiert ist.
	 * @return	'true' wenn ja, 'false' wenn nein
	 */
	public boolean protegiert() {
		if (wirtschaftsZustand != Zustand.NEUTRAL
		&&  wirtschaftsZustand != Zustand.AUFSICHTSRAT) {
			return true;
		}
		
		return false;
	}
	
	/**
	 * Setzt den Parteizustand des Politikers wenn er von der Partei gelobt wird.
	 */
	public void parteilob() {
		switch(parteiZustand) {
		case LOYAL:			parteiZustand = Zustand.KRIECHEND;		break;
		case KRIECHEND:		wirtschaftsZustand = Zustand.NEUTRAL;	break;
		case REBELLISCH:	parteiZustand = Zustand.LOYAL;			break;
		}
	}
	
	/**
	 * Setzt den Parteizustand des Politikers wenn er von der Partei getadelt wird.
	 */
	public void parteitadel() {
		switch(parteiZustand) {
		case LOYAL:			parteiZustand = Zustand.REBELLISCH;		break;
		case KRIECHEND:		parteiZustand = Zustand.REBELLISCH;		break;
		}
	}
	
	/**
	 * Setzt den Wirtschaftszustand des Politikers wenn er von der Wirtschaft gelobt wird.
	 */
	public void wirtschaftslob() {
		switch(wirtschaftsZustand) {
		case REHABILITIERT:	wirtschaftsZustand = Zustand.ERGEBEN;		break;
		case ERGEBEN:		wirtschaftsZustand = Zustand.HOERIG;		break;
		case HOERIG:		wirtschaftsZustand = Zustand.AUFSICHTSRAT;	break;
		case NEUTRAL:		wirtschaftsZustand = Zustand.REHABILITIERT;	break;
		}
	}
	
	/**
	 * Setzt den Wirtschaftszustand des Politikers wenn er von der Partei kritisiert wird.
	 */
	public void wirtschaftskritik() {
		if (this.protegiert()) {
			wirtschaftsZustand = Zustand.NEUTRAL;
		}
	}
	
	/**
	 * Setzt den Partei- und Wirtschaftszustand des Politikers auf NONE wird.
	 */
	public void erwischt() {
		parteiZustand = Zustand.RUHESTAND;
		wirtschaftsZustand = Zustand.RUHESTAND;
	}
	
	/**
	 * Liefert den Parteizustand.
	 * @return	Zustand
	 */
	public Zustand getParteiZustand() {
		return parteiZustand;
	}

	/**
	 * Setzt den Parteizustand.
	 * @param parteiZustand	Zustand
	 */
	public void setParteiZustand(Zustand parteiZustand) {
		this.parteiZustand = parteiZustand;
	}

	/**
	 * Liefert den Wirtschaftszustand.
	 * @return	Zustand
	 */
	public Zustand getWirtschaftsZustand() {
		return wirtschaftsZustand;
	}

	/**
	 * Setzt den Wirtschaftszustand.
	 * @param wirtschaftsZustand	Zustand
	 */
	public void setWirtschaftsZustand(Zustand wirtschaftsZustand) {
		this.wirtschaftsZustand = wirtschaftsZustand;
	}

	/**
	 * Konstruiert String zur Zustandsbeschreibung.
	 */
	@Override
	public String toString() {
		String ret = "";
		
		if (parteiZustand == Zustand.RUHESTAND
		||  wirtschaftsZustand == Zustand.RUHESTAND)
			return Zustand.RUHESTAND.toString();
		
		if (this.aktiv()) {
			ret+=Zustand.POLITISCH_AKTIV.toString()+" ";
			ret+=parteiZustand.toString()+" ";
		}
		
		if (this.protegiert())
			ret+=Zustand.PROTEGIERT.toString()+" ";
		
		ret+=wirtschaftsZustand.toString();
		
		return ret;
	}

}
